package demo1;

// 导入日期格式化类，用于将日期对象格式化为指定格式的字符串
import java.text.SimpleDateFormat;
// 导入日期类，用于获取当前时间
import java.util.Date;
// 导入 HashMap 类，用于存储学生的签到信息
import java.util.HashMap;
// 导入 Map 接口，用于定义存储学生签到信息的容器类型
import java.util.Map;

/**
 * 报到签到类，用于管理学生的报到签到信息
 */
public class RegistrationCheckIn {
    // 使用 Map 存储学生的签到信息，键为学生姓名，值为 CheckInInfo 对象
    // 该字段用于存储所有学生的签到信息，使用静态变量可以在类的所有实例中共享
    private static Map<String, CheckInInfo> checkInInfos = new HashMap<>();
    // 签到编号计数器，用于生成唯一的签到编号
    // 该字段用于记录当前的签到编号，每次签到时会自增，确保每个学生的签到编号唯一
    private static int checkInIdCounter = 1;

    /**
     * 签到信息内部类，用于表示单个学生的签到信息
     */
    static class CheckInInfo {
        // 签到编号
        // 该字段用于唯一标识每个学生的签到记录
        private int checkInId;
        // 学生入校时间
        // 该字段用于记录学生的入校时间，格式为 "yyyy-MM-dd HH:mm:ss"
        private String entryTime;
        // 学生对象
        // 该字段用于关联学生的基本信息
        private StudentInfo.Student student;

        /**
         * 构造函数，用于初始化签到信息
         * @param checkInId 签到编号
         * @param entryTime 学生入校时间
         * @param student 学生对象
         */
        public CheckInInfo(int checkInId, String entryTime, StudentInfo.Student student) {
            // 初始化签到编号
            this.checkInId = checkInId;
            // 初始化学生入校时间
            this.entryTime = entryTime;
            // 初始化学生对象
            this.student = student;
        }

        /**
         * 重写 toString 方法，用于打印签到信息
         * @return 包含签到信息的字符串
         */
        @Override
        public String toString() {
            // 返回包含签到编号、学生入校时间和学生信息的字符串
            return "签到编号: " + checkInId + ", 学生入校时间: " + entryTime + ", " + student;
        }
    }

    /**
     * 学生签到方法
     * @param name 学生姓名
     */
    public static void checkIn(String name) {
        // 根据学生姓名从 StudentInfo 类中获取学生对象
        StudentInfo.Student student = StudentInfo.getStudent(name);
        // 检查学生对象是否存在
        if (student != null) {
            // 获取当前时间并格式化为指定格式
            // 创建日期格式化对象，指定日期格式为 "yyyy-MM-dd HH:mm:ss"
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            // 获取当前时间并格式化为指定格式的字符串
            String entryTime = sdf.format(new Date());
            // 生成唯一的签到编号
            int checkInId = checkInIdCounter++;
            // 将学生的签到信息存储到 checkInInfos 中
            checkInInfos.put(name, new CheckInInfo(checkInId, entryTime, student));
            // 输出签到成功的信息
            System.out.println(name + " 签到成功");
        } else {
            // 若未找到学生信息，输出无法签到的信息
            System.out.println("未找到该学生信息，无法签到");
        }
    }

    /**
     * 根据学生姓名显示学生的报到信息
     * @param name 学生姓名
     */
    public static void displayCheckInInfo(String name) {
        // 根据学生姓名从 checkInInfos 中获取签到信息
        CheckInInfo checkInInfo = checkInInfos.get(name);
        // 检查签到信息是否存在
        if (checkInInfo != null) {
            // 若存在，输出签到信息
            System.out.println(checkInInfo);
        } else {
            // 若不存在，输出未找到报到信息的提示
            System.out.println("未找到该学生的报到信息");
        }
    }
}